package com.hc.authority.impl;

import com.hc.authority.MyAuthorityPermission;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * 通常使用路径地址作为映射规则：直接匹配资源信息，不匹配角色信息
 */
@Component
public class MyAuthorityPermissionImpl implements MyAuthorityPermission {

    /**
     * 请求参数中包含相关信息：
     * 参数名：roles  参数值：字符串数组。代表本次请求需要的角色权限
     * 参数名：authorities  参数值：字符串数组。代表本次请求需要的资源权限
     *
     * @param request        包含请求路径、请求参数、请求作用域
     * @param authentication 用户登录后，SpringSecurity维护用户的登录标记，内部包含登录用户的名称和权限集合
     * @return
     */
    @Override
    public boolean hasAuthority(HttpServletRequest request, Authentication authentication) {
        //获取当前登录用户拥有的权限集合列表
        //获取请求参数
        String[] roles = request.getParameterValues("roles");
        //判断角色权限
        for (String role : roles) {
            String temp = "ROLE_" + role;
            if (authentication.getAuthorities().contains(new SimpleGrantedAuthority(temp))) {
                return true;//登录用户有权限，可以访问
            }
        }

        String[] authorities = request.getParameterValues("authorities");
        //判断资源权限
        for (String authority : authorities) {
            if (authentication.getAuthorities().contains(new SimpleGrantedAuthority(authority))) {
                return true;
            }
        }

        return false; //登录用户无权限不可以访问
    }
}
